#pragma once
#include "singleton.h"
#include "hiredis.h"
#include <memory>


//负责与数据库交互，属于Model层

class RedisConPool;
class RedisMgr :public Singleton<RedisMgr>
{
public:
	friend class Singleton<RedisMgr>;
	~RedisMgr();
	RedisMgr(const RedisMgr&) = delete;
	RedisMgr& operator=(const RedisMgr&) = delete;

	bool Connect(const std::string& host, int port);						//连接至yigeredis,这里底层使用连接池，最好是使用单例模式，不能创建多个连接池
	bool Get(const std::string& key, std::string& value);
	bool Set(const std::string& key, const std::string& value);
	bool Auth(const std::string& password);									//登录
	bool LPush(const std::string& key, const std::string& value);			//左push
	bool LPop(const std::string& key, std::string& value);
	bool RPush(const std::string& key, const std::string& value);
	bool RPop(const std::string& key, std::string& value);
	bool HSet(const std::string& key, const std::string& hkey, const std::string& value);
	bool HSet(const char* key, const char* hkey, const char* hvalue, size_t hvaluelen);
	std::string HGet(const std::string& key, const std::string& hkey);
	bool Del(const std::string& key);
	bool ExistsKey(const std::string& key);
	void Close();
private:
	RedisMgr();


public:
	redisReply* _reply;
	std::unique_ptr<RedisConPool> _con_pool;								
};

